package com.hnchances.studentscoresystem.controller;

import com.hnchances.studentscoresystem.dto.request.UserDeleteDTO;
import com.hnchances.studentscoresystem.dto.request.UserInfoQueryDTO;
import com.hnchances.studentscoresystem.dto.request.UserLoginDTO;
import com.hnchances.studentscoresystem.dto.request.UserRegisterDTO;
import com.hnchances.studentscoresystem.dto.request.UserUpdateDTO;
import com.hnchances.studentscoresystem.dto.response.CommonResponse;
import com.hnchances.studentscoresystem.dto.response.LoginResponse;
import com.hnchances.studentscoresystem.dto.response.UserInfoResponse;
import com.hnchances.studentscoresystem.dto.response.UserOperateResponse;
import com.hnchances.studentscoresystem.service.UserService;
import com.hnchances.studentscoresystem.util.JwtUtil;
import jakarta.servlet.http.HttpServletRequest;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;


/**
 * 用户管理控制器（核心）
 * 接口前缀：/user
 * 鉴权规则：
 *  - /register、/login：无鉴权
 *  - /userinfo、/update、/del：有鉴权（需Token）
 * 严格遵循《实战测试.docx》3.4.1-3.4.5需求
 */
@Slf4j
@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    private UserService userService;

    @Autowired
    private JwtUtil jwtUtil;

    /**
     * 3.4.1 用户注册（无鉴权，支持学生/老师，管理员免做）
     * @param registerDTO 注册请求参数（含身份、身份证等信息）
     * @return 注册结果
     */
    @PostMapping("/register")
    public CommonResponse<UserOperateResponse> register(@RequestBody UserRegisterDTO registerDTO) {
        log.info("用户注册，userName: {}, identity: {}", registerDTO.getUserName(), registerDTO.getIdentity());
        boolean success = userService.register(registerDTO);
        UserOperateResponse response = new UserOperateResponse();
        response.setSuccess(success);
        // 若需返回注册用户ID，可在UserService.register中补充ID回显逻辑
        return CommonResponse.success(response, "用户注册成功");
    }

    /**
     * 3.4.4 用户登录（无鉴权，学生/老师通用，返回JWT Token）
     * @param loginDTO 登录请求参数（userName、passWord）
     * @param request Http请求（用于获取登录IP）
     * @return 登录结果（含Token）
     */
    @PostMapping("/login")
    public CommonResponse<LoginResponse> login(@RequestBody UserLoginDTO loginDTO, HttpServletRequest request) {
        log.info("用户登录，userName: {}", loginDTO.getUserName());
        // 获取登录IP（适配代理场景）
        String loginIp = getClientIp(request);
        // 调用Service生成Token
        String token = userService.login(loginDTO, loginIp);
        // 构建登录响应（含Token及有效期）
        LoginResponse loginResponse = new LoginResponse();
        loginResponse.setToken(token);
        loginResponse.setExpire(86400L); // Token有效期24小时（秒）
        return CommonResponse.success(loginResponse, "登录成功");
    }

    /**
     * 3.4.5 用户信息查询（有鉴权，入参为Token）
     * @param queryDTO 查询请求参数（仅含token）
     * @return 用户信息（排除密码）
     */
    @PostMapping("/userinfo")
    public CommonResponse<UserInfoResponse> getUserInfo(@RequestBody UserInfoQueryDTO queryDTO) {
        log.info("用户信息查询，token: {}", queryDTO.getToken().substring(0, 10) + "...");
        UserInfoResponse userInfo = userService.getUserInfoByToken(queryDTO.getToken());
        return CommonResponse.success(userInfo, "用户信息查询成功");
    }

    /**
     * 3.4.2 用户修改（有鉴权，仅本人或管理员可修改）
     * @param updateDTO 修改请求参数（含用户ID、新信息）
     * @param token 请求头中的Token（用于解析操作人ID）
     * @return 修改结果
     */
    @PostMapping("/update")
    public CommonResponse<UserOperateResponse> updateUser(
            @RequestBody UserUpdateDTO updateDTO,
            @RequestHeader("Authorization") String token) {
        log.info("用户修改，userId: {}", updateDTO.getId());
        // 解析Token获取操作人ID
        Long operatorId = jwtUtil.getUserIdFromToken(token);
        boolean success = userService.updateUser(updateDTO, operatorId);
        UserOperateResponse response = new UserOperateResponse();
        response.setSuccess(success);
        response.setUserId(updateDTO.getId());
        return CommonResponse.success(response, "用户信息修改成功");
    }

    /**
     * 3.4.3 用户删除（有鉴权，仅老师可删除本班级用户，学生无权限）
     * @param deleteDTO 删除请求参数（含待删除用户ID）
     * @param token 请求头中的Token（用于解析操作人身份、班级）
     * @return 删除结果
     */
    @PostMapping("/del")
    public CommonResponse<UserOperateResponse> deleteUser(
            @RequestBody UserDeleteDTO deleteDTO,
            @RequestHeader("Authorization") String token) {
        log.info("用户删除，deletedUserId: {}", deleteDTO.getDeletedUserId());
        // 解析Token获取操作人信息
        Long operatorId = jwtUtil.getUserIdFromToken(token);
        Integer operatorIdentity = jwtUtil.getIdentityFromToken(token);
        Integer operatorClassId = userService.getUserInfoByToken(token).getClassID();
        // 调用Service执行删除（含权限校验）
        boolean success = userService.deleteUser(
                deleteDTO.getDeletedUserId(), operatorId, operatorIdentity, operatorClassId);
        UserOperateResponse response = new UserOperateResponse();
        response.setSuccess(success);
        response.setUserId(deleteDTO.getDeletedUserId());
        return CommonResponse.success(response, "用户删除成功");
    }

    /**
     * 工具方法：获取客户端真实IP（适配代理、负载均衡场景）
     */
    private String getClientIp(HttpServletRequest request) {
        String ip = request.getHeader("X-Forwarded-For");
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("Proxy-Client-IP");
        }
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("WL-Proxy-Client-IP");
        }
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getRemoteAddr();
        }
        // 若为多IP（如代理链），取第一个非unknown的IP
        if (ip != null && ip.contains(",")) {
            ip = ip.split(",")[0].trim();
        }
        return ip;
    }
}